package com.wms.ymcc.service.impl;

import com.wms.ymcc.constant.ValidationConstants;
import com.wms.ymcc.exception.GlobalBaseException;
import com.wms.ymcc.pojo.VerifyCode;
import com.wms.ymcc.service.VerifyCodeService;
import com.wms.ymcc.util.SendSmsUtil;
import com.wms.ymcc.util.StrUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * @author : 阿盛哟
 * @description : 验证码服务实现类
 * @createDate : 2025/5/29 14:52
 */

@Service
@Slf4j
public class VerifyCodeServiceImpl implements VerifyCodeService {

    /**
     * 后端业务：  code===> 验证码    三分钟过期
     * <p>
     * 1. 判断redis中是否有code
     * <p>
     * 2. 如果有，代表了3分钟之内是发送过的
     * <p>
     * 2.1： 判断是否是在一分钟之内获取
     * 如果是一分钟之内，直接提示用户，一分钟只允许获取一次
     * 2.2： 如果不是在一分钟之内
     * 重新发送之前的验证码 ---》
     * 刷新redis中code的过期时间。
     * <p>
     * 3. 如果没有
     * 3.1： 生成一个随机验证码 4 位数  6666
     * 3.2： 存入redis中，设置过期时间为三分钟。
     * <p>
     * key: value
     * key:  业务键+phone
     * value: code, 当前的时间戳   6666     1111111111111
     * <p>
     * value：String设计  6666:11111111111
     * 对象； code, time
     */

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    @Override
    public void sendSmsCode(String mobile) {

        // 校验手机号是否合法  正则
        if (StringUtils.isEmpty(mobile)) {
            // 常量
            throw new GlobalBaseException("手机号不能为空");
        }

//        后端业务：  code===> 验证码    三分钟过期

//        1. 判断redis中是否有code， 从redis中获取
        // 好牛批
        String key = String.format(ValidationConstants.REDIS_KEY_SMS, mobile);
        VerifyCode verifyCode = (VerifyCode) redisTemplate.opsForValue().get(key);
        Date date = new Date();
        long time = date.getTime();

        String code = null;
//        2. 如果有，代表了3分钟之内是发送过的
        if (verifyCode != null) {
            //2.1： 判断是否是在一分钟之内获取
            if ((time - verifyCode.getTimer()) / 1000 < 60) {
                //如果是一分钟之内，直接提示用户，一分钟只允许获取一次
                throw new GlobalBaseException("一分钟之内不允许重复获取");
            }
            //        2.2： 如果不是在一分钟之内
            //        重新发送之前的验证码 ---》
            code = verifyCode.getCode();
            //        刷新redis中code的过期时间。
        } else {
//        3.1： 生成一个随机验证码 4 位数  6666
            code = StrUtils.getRandomString(4);
        }
        // 3.2： 存入redis中，设置过期时间为三分钟。
        // key:  业务键：sms :  mobile
        VerifyCode verifyCode2 = new VerifyCode(code, time);
        redisTemplate.opsForValue().set(
                key,  // key
                verifyCode2,  // code+ 时间戳
                3,  // 过期时间
                TimeUnit.MINUTES  // 过期时间的单位
        );
        // 发送短信
        //SendSmsUtil.sendSms(mobile,code);
//         SendSmsUtil.sendSms(mobile,code);
        // 发送给用户，调用短信平台发送//@TODO

        log.info("验证码为:{},请在{}分钟只能使用",code,3);
    }
}